package com.xxk.wdis.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xxk.wdis.entity.DrugInfo;
import com.xxk.wdis.service.IDrugInfoService;
import com.xxk.wdis.utills.HisResult;
import com.xxk.wdis.utills.PinYinUtils;
import com.xxk.wdis.utills.WubiUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 药品基础信息表 前端控制器
 * 遵循http 规范
 * 常用的HTTP动词有下面五个（括号里是对应的SQL命令）。
 * GET（SELECT）：从服务器取出资源（一项或多项）。
 * POST（CREATE）：在服务器新建一个资源。
 * PUT（UPDATE）：在服务器更新资源（客户端提供改变后的完整资源）
 * PATCH（UPDATE）：在服务器更新资源（客户端提供改变的属性）。
 * DELETE（DELETE）：从服务器删除资源。
 * 增 /drug-info/insert
 * 删 /drug-info/delete
 * 改 /drug-info/update
 * 查 /drug-info/getById /drug-info/listByStatus
 * </p>
 *
 * @author cwb
 * @since 2020-03-28
 */
@RestController
@RequestMapping("/drug-info")
@Slf4j
public class DrugInfoController {
    @Autowired
    IDrugInfoService iDrugInfoService;

    @GetMapping("/findall")
    public Object findall() {
        return iDrugInfoService.list();
    }

    /**
     * drug_info 药品信息表：新增
     *
     * @param drugInfo 药品信息实体类
     * @return HisResult
     */
    @PostMapping("/insert")
    public Object insert(DrugInfo drugInfo) {
        try {
            // 设置默认值
            drugInfo.setStatus(1);
            drugInfo.setGmtCreate(LocalDateTime.now());
            if (StringUtils.isNotEmpty(drugInfo.getDrugName())) {
                drugInfo.setPy(PinYinUtils.getPinYinHeadChar(drugInfo.getDrugName()));
                drugInfo.setWb(WubiUtil.getWBCode(drugInfo.getDrugName()));
            }

            if (iDrugInfoService.save(drugInfo)) {
                // 新增成功
                return HisResult.ok(drugInfo);
            } else {
                // 新增失败
                log.error("药品信息：新增失败");
                return HisResult.error("药品信息：新增失败");
            }
        } catch (Exception e) {
            log.error("药品信息：新增出错", e);
            return HisResult.error("新增出错，错误提示：", e.getMessage());
        }
    }

    /**
     * drug_info 药品信息表：删除
     *
     * @param drugId 药品信息id
     * @return HisResult
     */
    @DeleteMapping("/delete")
    public Object delete(@RequestParam Long drugId) {
        try {
            DrugInfo drugInfo = iDrugInfoService.getById(drugId);
            if (drugInfo == null) {
                return HisResult.error("此药品ID：" + drugId + "不存在，请检查");
            }
            if (iDrugInfoService.removeById(drugId)) {
                // 删除成功
                log.info("药品信息表执行删除，药品编号：{}", drugId);
                return HisResult.ok("删除成功！");
            } else {
                return HisResult.error("删除失败!");
            }
        } catch (Exception e) {
            log.error("删除执行出错", e);
            return HisResult.error("删除执行出错,错误提示：", e.getMessage());
        }
    }

    /**
     * drug_info 药品信息表：更新
     *
     * @param drugInfo 药品信息实体类
     * @return HisResult
     */
    @PutMapping("/update")
    public Object update(DrugInfo drugInfo) {
        try {
            // 检查id是否存在，不存在直接报错退出
            DrugInfo byId = iDrugInfoService.getById(drugInfo.getDrugId());
            if (byId == null) {
                return HisResult.error("此药品ID：" + drugInfo.getDrugId() + "不存在，请检查");
            }
            // 存在，进行更新
            drugInfo.setGmtUpdate(LocalDateTime.now());
            if (StringUtils.isNotEmpty(drugInfo.getDrugName())) {
                drugInfo.setPy(PinYinUtils.getPinYinHeadChar(drugInfo.getDrugName()));
                drugInfo.setWb(WubiUtil.getWBCode(drugInfo.getDrugName()));
            }
            if (iDrugInfoService.updateById(drugInfo)) {
                // 更新成功，重新查询并返回前台
                return HisResult.ok(iDrugInfoService.getById(drugInfo.getDrugId()));
            } else {
                // 更新失败
                return HisResult.error("更新失败!");
            }
        } catch (Exception e) {
            log.error("更新执行出错", e);
            return HisResult.error("更新执行出错,错误提示：", e.getMessage());
        }
    }

    /**
     * drug_info 药品信息表：按id查询
     *
     * @param drugId 药品信息id
     * @return HisResult
     */
    @GetMapping("/getById")
    public Object getById(@RequestParam Long drugId) {
        try {
            DrugInfo byId = iDrugInfoService.getById(drugId);
            if (byId == null) {
                return HisResult.error("此药品ID：" + drugId + "不存在，请检查");
            }
            return HisResult.ok(byId);
        } catch (Exception e) {
            log.error("按id查询执行出错", e);
            return HisResult.error("按id查询执行出错,错误提示：", e.getMessage());
        }
    }

    /**
     * drug_info 药品信息表：按状态查询
     *
     * @return
     */
    @GetMapping("/listByStatus")
    public Object list(@RequestParam Integer status) {
        QueryWrapper<DrugInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("status", status);
        List<DrugInfo> list = iDrugInfoService.list(queryWrapper);
        return HisResult.ok(list);
    }

    /**
     * drug_info 药品信息表：按id停用或启用
     *
     * @param drugId 药品id
     * @return DrugInfo
     */
    @PutMapping("stop")
    public Object stop(@RequestParam Long drugId) {
        try {
            DrugInfo byId = iDrugInfoService.getById(drugId);
            if (byId == null) {
                return HisResult.error("此药品ID：" + drugId + "不存在，请检查");
            }
            // 如果存在，切换状态,并更新
            byId.setStatus(-(byId.getStatus()));
            if (iDrugInfoService.updateById(byId)) {
                return HisResult.ok(byId);
            } else {
                return HisResult.error("停用/启用失败");
            }
        } catch (Exception e) {
            log.error("停用/启用执行出错", e);
            return HisResult.error("停用/启用执行出错,错误提示：", e.getMessage());
        }
    }
}

